home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / Apps / DevTools / eText5 / Source / eTImage.subproj / eTImageUI.m < prev    next >
Encoding:
Text File  |  1995-02-14  |  6.8 KB  |  243 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //    FILENAME:    eTImageUI.m
  3. //    SUMMARY:    Inspector for an eTImage annotation (uses eTImageComponent)
  4. //    SUPERCLASS:    Object
  5. //    INTERFACE:    None
  6. //    PROTOCOLS:    <Inspectable>
  7. //    AUTHOR:        Rohit Khare and Tom Zavisca
  8. //    COPYRIGHT:    (c) 1994 California Institure of Technology, eText Project
  9. ///////////////////////////////////////////////////////////////////////////////
  10. //    IMPLEMENTATION COMMENTS
  11. //        This inspector has the expressive power to control an eTImage and its
  12. //    eTImageComponent. The class is also written so that it can be "shared" 
  13. //    by chaining it together with another inspecto (by inheritance or by
  14. //    delegation).
  15. ///////////////////////////////////////////////////////////////////////////////
  16. //    HISTORY
  17. //    11/26/94:    Added pull-down menu, image-from-caption options.
  18. //    07/19/94:    Rewritten from scratch (RK) from remains of ImageAnnotationUI.
  19. ///////////////////////////////////////////////////////////////////////////////
  20.  
  21. #import "eTImageUI.h"
  22.  
  23. @implementation eTImageUI
  24. //    id        etImage
  25. //    id        controlPanel
  26. //    id        controlView
  27. //    id        componentNameField
  28. //    id        descriptionField
  29. //    id        linkSwitch
  30. //    id        heightField
  31. //    id        widthField
  32. + new
  33. {
  34.     static eTImageUI *ui = nil;
  35.     
  36.     if (!ui) {
  37.         ui = [[eTImageUI alloc] init];
  38.     }
  39.     return ui;
  40. }
  41. - init
  42. {
  43.     char        buf[MAXPATHLEN];
  44.     NXBundle   *bundle;
  45.  
  46.     [super init];
  47.     bundle = [NXBundle bundleForClass:[eTImageUI class]];
  48.     if ( [bundle getPath:buf forResource:"eTImageUI" ofType:"nib"] ) {
  49.         [NXApp loadNibFile:buf owner:self withNames:NO];
  50.     } else {
  51.         NXLogError("NIB not found: eTImageUI");
  52.     }
  53.     controlView = [controlPanel contentView];
  54.     [descriptionField setDelegate:self];
  55.     [descriptionField setCharFilter:(NXCharFilterFunc)NXFieldFilter];
  56.     return self;
  57. }
  58. - free {return self;}
  59.  
  60. - setAnnotation:neweTImage
  61. {
  62.     NXSize *size;
  63.     
  64.     if (etImage == neweTImage) return self;
  65.     if (![neweTImage isKindOf:[eTImage class]]) return self;
  66.     
  67.     // do we have to force an unloading of the data currently in the panel?
  68.     // if (etImage) [self editDescription:descriptionField];
  69.     etImage = neweTImage;
  70.     size = [etImage size];
  71.     [heightField setFloatValue:size->height];
  72.     [widthField setFloatValue:size->width];
  73.     [descriptionField setText:[etImage description]];
  74.     [componentNameField setStringValue:
  75.         [[etImage imageComponent] componentName]];
  76.     [linkSwitch setState:[[etImage imageComponent] isLinked]];
  77.     return self;
  78. }
  79.  
  80. - chooseImage:sender
  81. {
  82.     // needs to reset shouldEdit and component name
  83.     const char *directory;
  84.     const char *const *files;
  85.     NXAtom       *importTypes;
  86.     int            i,choice;
  87.     char         path[MAXPATHLEN];
  88.     id            openpanel;
  89.     id            newImageComponent;
  90.     NXSize        *size;
  91.  
  92.     openpanel = (id)[[OpenPanel new] allowMultipleFiles:YES];
  93.     importTypes = (NXAtom *)[NXImage imageFileTypes];
  94.     [openpanel setTreatsFilePackagesAsDirectories:YES];
  95.     [openpanel chooseDirectories:NO];
  96.     i = [openpanel runModalForTypes:importTypes];
  97.     if (!i) return self;
  98.     files = [openpanel filenames];
  99.     directory = [openpanel directory];
  100.     strcpy(path, directory);
  101.     strcat(path, "/");
  102.     strcat(path, files[0]);
  103.     choice = NXRunAlertPanel("eTImage","Do you want to make a link to %s or copy it?", "Copy", "Link", NULL,path);
  104.     
  105.     newImageComponent = [[eTImageComponent alloc]
  106.                             initInDoc:[etImage etDoc] 
  107.                             linked: (choice == NX_ALERTALTERNATE)];
  108.     [newImageComponent readComponentFromPath:NXUniqueString(path)];
  109.     [etImage setImageComponent:newImageComponent];
  110.     
  111.     //NEW: Added by RK 12/23
  112.     [etImage setAltImageComponent:nil];
  113.     
  114.     [[etImage etDoc] touch];
  115.     [[etImage imageComponent] touch];
  116.     [etImage updateGraphics];
  117. //    this duplicates code from init:above
  118.     size = [etImage size];
  119.     [heightField setFloatValue:size->height];
  120.     [widthField setFloatValue:size->width];
  121.     [descriptionField setText:[etImage description]];
  122.     [componentNameField setStringValue:
  123.         [[etImage imageComponent] componentName]];
  124.     [linkSwitch setState:[[etImage imageComponent] isLinked]];
  125.     return self;
  126. }
  127.  
  128. - pasteImage:sender
  129. {
  130.     if ([NXImage canInitFromPasteboard:[Pasteboard newName:NXGeneralPboard]]) {
  131.         NXSize        *size;
  132.         id newImageComponent = [[eTImageComponent alloc]
  133.                                 initInDoc:[etImage etDoc] linked: NO];
  134.         [newImageComponent readComponentFromPboard:
  135.                                 [Pasteboard newName:NXGeneralPboard]];
  136.         [etImage setImageComponent:newImageComponent];
  137.  
  138.         //NEW: Added by RK 12/23
  139.         [etImage setAltImageComponent:nil];
  140.  
  141.         [[etImage etDoc] touch];
  142.         [[etImage imageComponent] touch];
  143.         [etImage updateGraphics];
  144.     //    this duplicates code from init:above
  145.         size = [etImage size];
  146.         [heightField setFloatValue:size->height];
  147.         [widthField setFloatValue:size->width];
  148.         [descriptionField setText:[etImage description]];
  149.         [componentNameField setStringValue:
  150.             [[etImage imageComponent] componentName]];
  151.         [linkSwitch setState:[[etImage imageComponent] isLinked]];
  152.     } else {
  153.         NXBeep();
  154.     }
  155.     return self;
  156. }
  157.  
  158. - captionImage:sender {
  159.     [etImage setCaptionMode];
  160.  
  161.     //NEW: Added by RK 12/23
  162.     //[etImage setAltImageComponent:nil];
  163.     // Taken out 2/14/95
  164.     
  165.     [etImage updateGraphics];
  166.  
  167.     return self;
  168. }
  169.  
  170. - uncaptionImage:sender {
  171.     [etImage setImageComponent:[etImage imageComponent]];
  172.     [etImage updateGraphics];
  173.     return self;
  174. }
  175.  
  176. - editDescription: sender    // descriptionField is a Text.
  177. {
  178.     char        *buf;
  179.     int            length;
  180.  
  181.     length = [descriptionField textLength]+1;
  182.     buf = malloc(length * sizeof(char));
  183.     [descriptionField getSubstring:(buf) start:0 length:length];
  184.     (buf)[length]=0;
  185.     [etImage setDescription:buf];
  186.     free(buf);
  187.     return self;
  188. }
  189. - editComponentName: sender
  190. {
  191.     [[etImage imageComponent] setComponentName:
  192.         NXUniqueString([componentNameField stringValue])];
  193.     [componentNameField setStringValue:
  194.         [[etImage imageComponent] componentName]];
  195.     [[etImage etDoc] touch];
  196.     [[etImage imageComponent] touch];
  197.     return self;
  198. }
  199. - editSize:sender
  200. {
  201.     NXSize size;
  202.  
  203.     size.height = fabs([heightField floatValue]);
  204.     size.width = fabs([widthField floatValue]);
  205.     [etImage setSize:&size];
  206.     // are size-changes are only a "run-time" feature?
  207.     [etImage updateGraphics];
  208.     return self;
  209. }
  210.  
  211. - (const NXAtom *) types
  212.     {static NXAtom types[2]={NULL,NULL}; 
  213.      if(!types[0]) types[0]=NXUniqueString("Image Properties"); return types;} 
  214. - inspectorForType:(const char *) type
  215.     {if(strcmp(type, NXUniqueString("Image Properties")))
  216.         NXLogError("Massive Inspector Failure: Asked eTImageUI for: %s", type);
  217.      return controlView;}
  218. - resignInspector: (View *) oldInspector ofType: (const char *) type
  219. {
  220.     // have to do dirty work here 
  221.     
  222.     return self;
  223. }
  224. - activateInspector:(View *) newInspector ofType:(const char *) type
  225. {
  226.     [[NXApp inspector] makeFirstResponder:descriptionField]; 
  227.  
  228.     //cleanup work here!
  229.  
  230.      return self;
  231. }
  232. - (const char *) inspectorTitle
  233.     {return NXUniqueString("Image");}
  234.  
  235.  
  236. - textDidEnd:sender endChar:(unsigned short)whyEnd
  237. {    // should this be checked programatically on setAnnotation:?
  238.     if(descriptionField==sender){ 
  239.         [self editDescription:sender];
  240.     }
  241.     return self;
  242. }
  243. @end